package com.itheima.d4_reflect_field;

import org.junit.Before;
import org.junit.Test;

import java.lang.reflect.Field;

/**
    目标：反射获取成员变量: 取值和赋值。

    Field的方法：给成员变量赋值和取值
        void set(Object obj, Object value)：给对象注入某个成员变量数据
        Object get(Object obj):获取对象的成员变量的值。
        void setAccessible(true);暴力反射，设置为可以直接访问私有类型的属性。
        Class getType(); 获取属性的类型，返回Class对象。
        String getName(); 获取属性的名称。
 */

public class FieldDemo02 {

    Class<Student> cls;
    @Before
    public void beforeTest(){
        cls = Student.class;
    }

    @Test
    public void setField() throws Exception {

        Student student = new Student();
        // a.反射第一步，获取类对象
        // b.提取某个成员变量
        Field schoolNameField = cls.getDeclaredField("schoolName");
        Field name = cls.getDeclaredField("name");
        Field age = cls.getDeclaredField("age");


        // 暴力打开权限
        name.setAccessible(true);
        age.setAccessible(true);
        // c.赋值
        name.set(student,"樊凯");
        age.set(student,1);

        schoolNameField.set(null,"黑马");

        System.out.println(student);


        // d、取值
        Object name1 = name.get(student);
        System.out.println(name1);
        Object age1 = age.get(student);
        System.out.println(age1);
        System.out.println(schoolNameField.get(null));


    }
}
